
package com.infore.common.utils;


import java.math.BigInteger;
import java.security.MessageDigest;
import java.security.NoSuchAlgorithmException;

/**
 * @Description MD5工具类
 * @Author xiangyp
 * @Date 2020/4/27
 * @Param
 * @Return
 **/
public class MD5Utils {

	public static String getMD5signString(String data){
		try{
			// 生成一个MD5加密计算摘要
			MessageDigest md = MessageDigest.getInstance("MD5");
			// 计算md5函数
			md.update(data.getBytes());
			// digest()最后确定返回md5 hash值，返回值为8为字符串。因为md5 hash值是16位的hex值，实际上就是8位的字符
			// BigInteger函数则将8位的字符串转换成16位hex值，用字符串来表示；得到字符串形式的hash值
			data = new BigInteger(1, md.digest()).toString(16);
		} catch (NoSuchAlgorithmException e) {
			data = "failKey";
		}
		return data;
	}

	public static String sha1(String data)  {
		//加盐   更安全一些
		data += "";
		//信息摘要器                                算法名称
		MessageDigest md = null;
		try {
			md = MessageDigest.getInstance("SHA1");
		} catch (NoSuchAlgorithmException e) {
			return "failKey";
		}
		//把字符串转为字节数组
		byte[] b = data.getBytes();
		//使用指定的字节来更新我们的摘要
		md.update(b);
		//获取密文  （完成摘要计算）
		byte[] b2 = md.digest();
		//获取计算的长度
		int len = b2.length;
		//16进制字符串
		String str = "0123456789abcdef";
		//把字符串转为字符串数组
		char[] ch = str.toCharArray();

		//创建一个40位长度的字节数组
		char[] chs = new char[len*2];
		//循环20次
		for(int i=0,k=0;i<len;i++) {
			byte b3 = b2[i];//获取摘要计算后的字节数组中的每个字节
			// >>>:无符号右移
			// &:按位与
			//0xf:0-15的数字
			chs[k++] = ch[b3 >>> 4 & 0xf];
			chs[k++] = ch[b3 & 0xf];
		}

		//字符数组转为字符串
		return new String(chs);
	}

}

